package ts;

import java.util.ArrayList;
import java.util.Iterator;

public class TipoProc extends Tipo {

	private ArrayList<ParamProc> campos;

	public TipoProc(ArrayList<ParamProc> c) {
		this.tipo = "proc";
		this.campos = new ArrayList<ParamProc>(c);
		this.tam = tamProc(campos);
	}

	private int tamProc(ArrayList<ParamProc> campos) {
		int tamProc = 0;
		Iterator<ParamProc> it = campos.iterator();
		while (it.hasNext()) {
			ParamProc c = it.next();
			if (c.getModo().equals("var"))
				tamProc += 1;
			else
				tamProc += c.getTipo().tam;
		}
		return tamProc;
	}

	public ArrayList<ParamProc> getCampos() {
		return campos;
	}

	public String muestraCampos() {
		Iterator<ParamProc> it = campos.iterator();
		String s = "[ ";
		while (it.hasNext()) {
			ParamProc c = it.next();
			s += " < id: " + c.getId() + ", modo: " + c.getModo()
					+ muestraTipo(c.getTipo()) + "> , desp: " + c.getDesp()
					+ ">, ";
		}
		return s.substring(0, s.length() - 1) + "]";
	}

	public Tipo dameTipoPorId(String id) {
		Iterator<ParamProc> it = campos.iterator();
		while (it.hasNext()) {
			ParamProc c = it.next();
			if (id.equals(c.getId()))
				return c.getTipo();
		}
		return new TipoError();
	}

	public String muestraTipo(Tipo tipo) {
		String mostrar = "";
		String nombreTipo = tipo.getTipo();
		if (nombreTipo.equals("natural") || nombreTipo.equals("integer")
				|| nombreTipo.equals("float") || nombreTipo.equals("character")
				|| nombreTipo.equals("boolean"))
			mostrar += ", tipo: <t: " + nombreTipo + ", tam: " + tipo.getTam();
		else if (nombreTipo.equals("array")) {
			mostrar += ", tipo: <t: " + tipo.getTipo() + ", nelems: "
					+ ((TipoArray) tipo).getNumElem() + ", tbase: ";
			Tipo tb = ((TipoArray) tipo).getTipoBase();
			if (tb.getTipo().equals("ref"))
				mostrar += "< t: ref " + ", id: "
						+ ((TipoIdent) tb).getId() + ", tam: "
						+ ((TipoIdent) tb).getTam();
			else if (tb.getTipo().equals("array"))
				mostrar += "< t: array , nelems: "
						+ ((TipoArray) tb).getNumElem() + ", tbase: "
						+ ((TipoArray) tb).getTipoBase().getTipo() +

						", tam: " + ((TipoArray) tb).getTam() + "> , tam: "
						+ ((TipoArray) tipo).getTam();

		} else if (tipo.getTipo().equals("tupla"))
			mostrar += " tipo: <t: " + tipo.getTipo() + ", campos:"
					+ ((TipoTupla) tipo).muestraCampos() + ", tam: "
					+ ((TipoTupla) tipo).getTam();
		else if (tipo.getTipo().equals("ref")) {
			mostrar += ", tipo: <t: " + tipo.getTipo() + ", id: "
					+ ((TipoIdent) tipo).getId() + ", tam: "
					+ ((TipoIdent) tipo).getTam();
		}
		return mostrar;
	}

}